//
//  MLUserAccountViewModel.swift
//  SinaWeibo
//
//  Created by 李亮亮 on 16/4/9.
//  Copyright © 2016年 Big Fish. All rights reserved.
//

import UIKit

private let userInfoKey = "userInfoKey"

//非常多的界面都会找viewmodel获取数据
//viewModel 处理业务逻辑 ,网络请求,数据缓存
class MLUserAccountViewModel: NSObject {

    // 单例
    static let sharedUserAccountViewModel: MLUserAccountViewModel = MLUserAccountViewModel()
    
    var userAccount: MLUserAccount?
    
    // 添加一个计算性属性(只读属性)
    var userLogin: Bool {
        // userAccount的access_token 如果不为nil && 用户的access_token不过期 => 用户已登录
        // 没有过期 -> 过期日期和当前日期比较 -> 过期日期大于当前日期
        if let u = userAccount where u.expires_date?.compare(NSDate()) == NSComparisonResult.OrderedDescending {
            return true
        }
        // 将userAccount 设置为 nil
        userAccount = nil
        return false
    }
    
    // 增加一个用户头像NSURL类型的属性
    var headImageURL: NSURL? {
        let url = NSURL(string: userAccount?.avatar_large ?? "")
        return url
    }
    
    // 私有化构造函数
    private override init() {
        super.init()
        userAccount = self.loadUserInfo()
    }
}
    
// MARK: - 用户登录相关的网络请求
extension MLUserAccountViewModel {
    // MARK: 使用授权码,请求accessToken
    func loadAccessToken(code: String, finished: (isSuccess: Bool) -> ()) {
        
        MLNetworkTools.sharedTools.loadAccessToken(code) { (result, error) in
            if error != nil {
                print(error)
                //                SVProgressHUD.showErrorWithStatus("shit")
                finished(isSuccess: false)
                return
            }
            // 程序走到这里,就一定成功
            print("授权成功")
            // 获取用户信息    在请求成功的回调中, 再去获取用户信息
            self.loadUserInfo(result!, finished:finished)
        }
    }
    
    // 获取用户信息  token, uid
    private func loadUserInfo(tokenresult: AnyObject, finished: (isSuccess: Bool) -> ()) {
        
        // 尝试将AnyObject转换为字典
        guard let dict = tokenresult as? [String: AnyObject] else {
            //            SVProgressHUD.showErrorWithStatus("shit again")
            finished(isSuccess: false)
            return
        }
        let token = dict["access_token"]!
        let uid = dict["uid"]!
        // 在result中读取 token, uid
//        let urlString = "https://api.weibo.com/2/users/show.json"
//        // 字典数组中不能够添加nil
//        let parameters = ["access_token": token, "uid": uid]
        
        MLNetworkTools.sharedTools.loadUserInfo(token, uid: uid) { (result, error) in
            if error != nil {
                print(error)
                //                SVProgressHUD.showErrorWithStatus("shit more again")
                finished(isSuccess: false)
                return
            }
            
            print("获取用户信息成功")
            // 将用户信息保存起来
            print(result)
            // 将anyObject转换为字典类型
            guard var userInfoDict = result as? [String: AnyObject] else {
                print(error)
                //                SVProgressHUD.showErrorWithStatus("fuch shit")
                finished(isSuccess: false)
                return
            }
            
            // 合并字典
            for (k,v) in dict {
                userInfoDict[k] = v
            }
            print(userInfoDict)
            
            self.saveUserAccount(userInfoDict)
            //            SVProgressHUD.showSuccessWithStatus("success")
            // 执行成功的回调
            finished(isSuccess: true)
        }
    }
}


// MARK: 存储数据,读取数据
extension MLUserAccountViewModel {
    
    // 存
    func saveUserAccount(userInfoDict: [String: AnyObject]) {
        
        // 保存完整的字典信息  偏好设置中不能保存nil
        let userDefaults = NSUserDefaults.standardUserDefaults()
        // 将字典信息转换为模型对象
        let account = MLUserAccount(dict: userInfoDict)
        
        // 给单例对象的用户账户模型属性赋值,为了解决从未登录状态到登录状态用户账户模型为空的问题
        userAccount = account
        
        // 获取模型对象字典信息
        let keys = ["access_token","avatar_large","name","expires_in","uid","expires_date"]
        let accountDict = account.dictionaryWithValuesForKeys(keys)
        // 将对象的字典信息保存到偏好设置中
        userDefaults.setObject(accountDict, forKey: userInfoKey)
        // 同步
        userDefaults.synchronize()
        
        // 打印沙盒地址
        print(NSHomeDirectory())
        
    }
    
    // 获取沙盒中存储的数据
    func loadUserInfo() -> MLUserAccount? {
        
        // 获取字典信息
        guard let dict = NSUserDefaults.standardUserDefaults().objectForKey(userInfoKey) as? [String: AnyObject] else {
            return nil
        }
        
        // 将字典转为模型  命中缓存
        let account = MLUserAccount(dict: dict)
        return account
        
    }
}
    
    

